package org.mbcorp.sar.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.mbcorp.sar.dao.CompetenciaDAO;
import org.mbcorp.sar.dao.LogroDAO;
import org.mbcorp.sar.dao.MedallaDAO;
import org.mbcorp.sar.dao.OperadorDAO;
import org.mbcorp.sar.model.Competencia;
import org.mbcorp.sar.model.Experticia;
import org.mbcorp.sar.model.Fase;
import org.mbcorp.sar.model.Logro;
import org.mbcorp.sar.model.Logro.Id;
import org.mbcorp.sar.model.Medalla;
import org.mbcorp.sar.model.Operador;
import org.mbcorp.sar.service.FaseService;
import org.mbcorp.sar.service.PuntajeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PuntajeServiceImpl implements PuntajeService{

	@Resource
	private OperadorDAO operadorDAO;
	
	@Resource
	private MedallaDAO medallaDAO;
	
	@Resource
	private CompetenciaDAO competenciaDAO;
	
	@Resource
	private LogroDAO logroDAO;
	
	@Autowired
	private FaseService faseService;
	
	@Transactional
	@Override
	public int mostrarPuntajeFinFase(Operador operadorActual, Fase fase) {
		int puntajeGanadoOperador = 0;
		for(Operador o : fase.getOperadoresActividades()){
			int puntajeGanado = (int) Math.round(faseService.getHorasTranscurridasPorOperador(fase, o) * this.sumarValorPuntaje(o, fase));
			o.setPuntajeAcumulado(o.getPuntajeAcumulado() + puntajeGanado);
			operadorDAO.save(o);
			if(o.getId() == operadorActual.getId()){
				puntajeGanadoOperador = puntajeGanado;
			}
		}
		return puntajeGanadoOperador;
	}
	
	private int sumarValorPuntaje(Operador operador, Fase fase){
		int sumaValor = 0;
		for(Experticia e : operador.getExperticias()){
			if(fase.getCompetencias().contains(e.getNivelCompetencia().getCompetencia())){
				sumaValor = sumaValor + e.getNivelCompetencia().getValorPuntaje();
			}
		}
		return sumaValor;
	}
	

	@Transactional
	@Override
	public List<Logro> mostrarLogrosFinFase(Operador operadorActual, Fase fase) {	
		List<Logro> logrosObtenidosOperador = null;
		for(Operador o : fase.getOperadoresActividades()){
			List<Logro> logrosObtenidos = new ArrayList<Logro>();
			int puntosLogros = 0;
			Logro logroNegocio = validarLogrosNegocio(o, fase);
			if(logroNegocio != null && logroNegocio.getFechaObtencion() != null){
				logrosObtenidos.add(logroNegocio);
				puntosLogros = puntosLogros + logroNegocio.getMedalla().getPuntaje();
			}
			Logro logroRachaAtencionTiempo = validarLogrosRachaAtencionTiempo(o, fase);
			if(logroRachaAtencionTiempo != null && logroRachaAtencionTiempo.getFechaObtencion() != null){
				logrosObtenidos.add(logroRachaAtencionTiempo);
				puntosLogros = puntosLogros + logroRachaAtencionTiempo.getMedalla().getPuntaje();
			}
			//logros UML
			Logro logroUML = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(1), 12, 11, 10);
			if(logroUML != null && logroUML.getFechaObtencion() != null){
				logrosObtenidos.add(logroUML);
				puntosLogros = puntosLogros + logroUML.getMedalla().getPuntaje();
			}
			//logros RUP
			Logro logroRUP = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(2), 15, 14, 13);
			if(logroRUP != null && logroRUP.getFechaObtencion() != null){
				logrosObtenidos.add(logroRUP);
				puntosLogros = puntosLogros + logroRUP.getMedalla().getPuntaje();
			}
			//logros BPM
			Logro logroBPM = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(3), 18, 17, 16);
			if(logroBPM != null && logroBPM.getFechaObtencion() != null){
				logrosObtenidos.add(logroBPM);
				puntosLogros = puntosLogros + logroBPM.getMedalla().getPuntaje();
			}
			//logros Java
			Logro logroJava = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(4), 21, 20, 19);
			if(logroJava != null && logroJava.getFechaObtencion() != null){
				logrosObtenidos.add(logroJava);
				puntosLogros = puntosLogros + logroJava.getMedalla().getPuntaje();
			}
			//logros Spring
			Logro logroSpring = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(5), 24, 23, 22);
			if(logroSpring != null && logroSpring.getFechaObtencion() != null){
				logrosObtenidos.add(logroSpring);
				puntosLogros = puntosLogros + logroSpring.getMedalla().getPuntaje();
			}
			//logros JUnit
			Logro logroJUnit = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(6), 27, 26, 25);
			if(logroJUnit != null && logroJUnit.getFechaObtencion() != null){
				logrosObtenidos.add(logroJUnit);
				puntosLogros = puntosLogros + logroJUnit.getMedalla().getPuntaje();
			}
			//logros Electronica
			Logro logroElectronica = validarLogrosCompetencia(o, fase, competenciaDAO.findOne(7), 30, 29, 28);
			if(logroElectronica != null && logroElectronica.getFechaObtencion() != null){
				logrosObtenidos.add(logroElectronica);
				puntosLogros = puntosLogros + logroElectronica.getMedalla().getPuntaje();
			}
			Logro logroPuntos = validarLogrosPuntos(o, fase, o.getPuntajeAcumulado() + puntosLogros);
			if(logroPuntos != null && logroPuntos.getFechaObtencion() != null){
				logrosObtenidos.add(logroPuntos);
				puntosLogros = puntosLogros + logroPuntos.getMedalla().getPuntaje();
			}
			if(puntosLogros > 0){
				o.setPuntajeAcumulado(o.getPuntajeAcumulado() + puntosLogros);
				operadorDAO.save(o);
			}			
			if(o.getId() == operadorActual.getId()){
				logrosObtenidosOperador = logrosObtenidos;
			}
		}
		return logrosObtenidosOperador;
	}
	
	@Transactional
	private Logro validarLogrosNegocio(Operador o, Fase f){
		Logro obtenido = null;
		Medalla bronce = medallaDAO.findOne(1);
		Medalla plata = medallaDAO.findOne(2);
		Medalla oro = medallaDAO.findOne(3);
		Id id = new Id(o.getId(),bronce.getId());
		Logro logroBronce = logroDAO.findOne(id);
		id = new Id(o.getId(),plata.getId());
		Logro logroPlata = logroDAO.findOne(id);
		id = new Id(o.getId(),oro.getId());
		Logro logroOro = logroDAO.findOne(id);
		logroBronce.setNivelProgreso(logroBronce.getNivelProgreso() + 1);
		logroPlata.setNivelProgreso(logroPlata.getNivelProgreso() + 1);
		logroOro.setNivelProgreso(logroOro.getNivelProgreso() + 1);
		
		if(logroBronce.getFechaObtencion() == null){
			if(logroBronce.getNivelProgreso() >= bronce.getTotalProgreso()){
				logroBronce.setFechaObtencion(new Date());	
				obtenido = logroBronce;
			}
		}
		if(logroPlata.getFechaObtencion() == null){
			if(logroPlata.getNivelProgreso() >= plata.getTotalProgreso()){
				logroPlata.setFechaObtencion(new Date());
				obtenido = logroPlata;
			}
		}
		if(logroOro.getFechaObtencion() == null){
			if(logroOro.getNivelProgreso() >= oro.getTotalProgreso()){
				logroOro.setFechaObtencion(new Date());
				obtenido = logroOro;
			}
		}
		logroDAO.save(logroBronce);
		logroDAO.save(logroPlata);
		logroDAO.save(logroOro);
		return obtenido;		
	}
	
//	@Transactional
//	private Logro validarLogrosNegocio(Operador o, Fase f){
//		Medalla oro = medallaDAO.findOne(3);
//		Id id = new Id(o.getId(),oro.getId());
//		Logro logro = logroDAO.findOne(id);
//		if(logro != null ){
//			if(logro.getFechaObtencion() != null){
//				logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//				logroDAO.save(logro);
//				return null;
//			} else{
//				logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//				if(logro.getNivelProgreso() >= oro.getTotalProgreso()){
//					logro.setFechaObtencion(new Date());					
//				}
//				return logroDAO.save(logro);
//			}
//		} else {
//			Medalla plata = medallaDAO.findOne(2);
//			id = new Id(o.getId(),plata.getId());
//			logro = logroDAO.findOne(id);
//			if(logro != null ){
//				logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//				if(logro.getNivelProgreso() >= plata.getTotalProgreso()){
//					logro.setFechaObtencion(new Date());
//					Logro nuevoOro = new Logro();
//					id = new  Id(o.getId(), oro.getId());
//					nuevoOro.setId(id);
//					nuevoOro.setMedalla(oro);
//					nuevoOro.setOperador(o);
//					nuevoOro.setNivelProgreso(logro.getNivelProgreso());
//					logroDAO.save(nuevoOro);
//				}
//				return logroDAO.save(logro);
//				
//			} else {
//				Medalla bronce = medallaDAO.findOne(1);
//				id = new Id(o.getId(),bronce.getId());
//				logro = logroDAO.findOne(id);
//				if(logro != null ){
//					logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//					if(logro.getNivelProgreso() >= bronce.getTotalProgreso()){
//						logro.setFechaObtencion(new Date());
//						Logro nuevoPlata = new Logro();
//						id = new  Id(o.getId(), plata.getId());
//						nuevoPlata.setId(id);
//						nuevoPlata.setMedalla(plata);
//						nuevoPlata.setOperador(o);
//						nuevoPlata.setNivelProgreso(logro.getNivelProgreso());
//						logroDAO.save(nuevoPlata);
//					}
//					return logroDAO.save(logro);
//				} else {
//					Logro nuevoBronce = new Logro();
//					id = new  Id(o.getId(), bronce.getId());
//					nuevoBronce.setId(id);
//					nuevoBronce.setMedalla(bronce);
//					nuevoBronce.setOperador(o);
//					nuevoBronce.setNivelProgreso(1);
//					return logroDAO.save(nuevoBronce);
//				}
//			}
//		}
//	}	
	
	@Transactional
	private Logro validarLogrosRachaAtencionTiempo(Operador o, Fase f){
		Logro obtenido = null;
		Medalla bronce = medallaDAO.findOne(4);
		Medalla plata = medallaDAO.findOne(5);
		Medalla oro = medallaDAO.findOne(6);
		Id id = new Id(o.getId(),bronce.getId());
		Logro logroBronce = logroDAO.findOne(id);
		id = new Id(o.getId(),plata.getId());
		Logro logroPlata = logroDAO.findOne(id);
		id = new Id(o.getId(),oro.getId());
		Logro logroOro = logroDAO.findOne(id);
		
		boolean flagEnTiempo;
		if(f.getFechaProgramadaFin().after(f.getFechaFin())){
			flagEnTiempo = true;
		} else {
			flagEnTiempo = false;
		}
		
		if(flagEnTiempo){
			logroBronce.setNivelProgreso(logroBronce.getNivelProgreso() + 1);
			logroPlata.setNivelProgreso(logroPlata.getNivelProgreso() + 1);
			logroOro.setNivelProgreso(logroOro.getNivelProgreso() + 1);
			if(logroBronce.getFechaObtencion() == null){
				if(logroBronce.getNivelProgreso() >= bronce.getTotalProgreso()){
					logroBronce.setFechaObtencion(new Date());	
					obtenido = logroBronce;
				}
			}
			if(logroPlata.getFechaObtencion() == null){
				if(logroPlata.getNivelProgreso() >= plata.getTotalProgreso()){
					logroPlata.setFechaObtencion(new Date());
					obtenido = logroPlata;
				}
			}
			if(logroOro.getFechaObtencion() == null){
				if(logroOro.getNivelProgreso() >= oro.getTotalProgreso()){
					logroOro.setFechaObtencion(new Date());
					obtenido = logroOro;
				}
			}
		} else {
			if(logroBronce.getFechaObtencion() == null){
				logroBronce.setNivelProgreso(0);
			}
			if(logroPlata.getFechaObtencion() == null){
				logroBronce.setNivelProgreso(0);
			}
			if(logroOro.getFechaObtencion() == null){
				logroBronce.setNivelProgreso(0);
			}
		}		
		logroDAO.save(logroBronce);
		logroDAO.save(logroPlata);
		logroDAO.save(logroOro);
		return obtenido;		
	}
	
//	@Transactional
//	private Logro validarLogrosRachaAtencionTiempo(Operador o, Fase f){
//		boolean flagEnTiempo;
//		if(f.getFechaProgramadaFin().after(f.getFechaFin())){
//			flagEnTiempo = true;
//		} else {
//			flagEnTiempo = false;
//		}		
//		Medalla oro = medallaDAO.findOne(6);
//		Id id = new Id(o.getId(),oro.getId());
//		Logro logro = logroDAO.findOne(id);
//		if(logro != null ){
//			if(logro.getFechaObtencion() != null){
//				if(flagEnTiempo){
//					logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//				} else {
//					logro.setNivelProgreso(0);
//				}				
//				logroDAO.save(logro);
//				return null;
//			} else{
//				if(flagEnTiempo){
//					logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//					if(logro.getNivelProgreso() >= oro.getTotalProgreso()){
//						logro.setFechaObtencion(new Date());					
//					}
//				} else {
//					logro.setNivelProgreso(0);
//				}				
//				return logroDAO.save(logro);
//			}
//		} else {
//			Medalla plata = medallaDAO.findOne(5);
//			id = new Id(o.getId(),plata.getId());
//			logro = logroDAO.findOne(id);
//			if(logro != null ){
//				if(flagEnTiempo){
//					logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//					if(logro.getNivelProgreso() >= plata.getTotalProgreso()){
//						logro.setFechaObtencion(new Date());
//						Logro nuevoOro = new Logro();
//						id = new  Id(o.getId(), oro.getId());
//						nuevoOro.setId(id);
//						nuevoOro.setMedalla(oro);
//						nuevoOro.setOperador(o);
//						nuevoOro.setNivelProgreso(logro.getNivelProgreso());
//						logroDAO.save(nuevoOro);
//					}
//				} else {
//					logro.setNivelProgreso(0);
//				}				
//				return logroDAO.save(logro);
//				
//			} else {
//				Medalla bronce = medallaDAO.findOne(4);
//				id = new Id(o.getId(),bronce.getId());
//				logro = logroDAO.findOne(id);
//				if(logro != null ){
//					if(flagEnTiempo){
//						logro.setNivelProgreso(logro.getNivelProgreso() + 1);
//						if(logro.getNivelProgreso() >= bronce.getTotalProgreso()){
//							logro.setFechaObtencion(new Date());
//							Logro nuevoPlata = new Logro();
//							id = new  Id(o.getId(), plata.getId());
//							nuevoPlata.setId(id);
//							nuevoPlata.setMedalla(plata);
//							nuevoPlata.setOperador(o);
//							nuevoPlata.setNivelProgreso(logro.getNivelProgreso());
//							logroDAO.save(nuevoPlata);
//						}
//					} else {
//						logro.setNivelProgreso(0);
//					}					
//					return logroDAO.save(logro);
//				} else {
//					Logro nuevoBronce = new Logro();
//					id = new  Id(o.getId(), bronce.getId());
//					nuevoBronce.setId(id);
//					nuevoBronce.setMedalla(bronce);
//					nuevoBronce.setOperador(o);
//					nuevoBronce.setNivelProgreso(1);
//					return logroDAO.save(nuevoBronce);
//				}
//			}
//		}
//	}
	
	@Transactional
	private Logro validarLogrosPuntos(Operador o, Fase f, Integer puntosActuales){
		Logro obtenido = null;
		Medalla bronce = medallaDAO.findOne(7);
		Medalla plata = medallaDAO.findOne(8);
		Medalla oro = medallaDAO.findOne(9);
		Id id = new Id(o.getId(),bronce.getId());
		Logro logroBronce = logroDAO.findOne(id);
		id = new Id(o.getId(),plata.getId());
		Logro logroPlata = logroDAO.findOne(id);
		id = new Id(o.getId(),oro.getId());
		Logro logroOro = logroDAO.findOne(id);
		logroBronce.setNivelProgreso(puntosActuales);
		logroPlata.setNivelProgreso(puntosActuales);
		logroOro.setNivelProgreso(puntosActuales);
		
		if(logroBronce.getFechaObtencion() == null){
			if(logroBronce.getNivelProgreso() >= bronce.getTotalProgreso()){
				logroBronce.setFechaObtencion(new Date());	
				obtenido = logroBronce;
			}
		}
		if(logroPlata.getFechaObtencion() == null){
			if(logroPlata.getNivelProgreso() >= plata.getTotalProgreso()){
				logroPlata.setFechaObtencion(new Date());
				obtenido = logroPlata;
			}
		}
		if(logroOro.getFechaObtencion() == null){
			if(logroOro.getNivelProgreso() >= oro.getTotalProgreso()){
				logroOro.setFechaObtencion(new Date());
				obtenido = logroOro;
			}
		}
		logroDAO.save(logroBronce);
		logroDAO.save(logroPlata);
		logroDAO.save(logroOro);
		return obtenido;		
	}
	
//	@Transactional
//	private Logro validarLogrosPuntos(Operador o, Fase f, Integer puntosActuales){
//		int puntosTotal = puntosActuales;
//		Medalla oro = medallaDAO.findOne(9);
//		Id id = new Id(o.getId(),oro.getId());
//		Logro logro = logroDAO.findOne(id);
//		if(logro != null ){
//			if(logro.getFechaObtencion() != null){
//				logro.setNivelProgreso(puntosTotal);
//				logroDAO.save(logro);
//				return null;
//			} else{
//				logro.setNivelProgreso(puntosTotal);
//				if(logro.getNivelProgreso() >= oro.getTotalProgreso()){
//					logro.setFechaObtencion(new Date());					
//				}
//				return logroDAO.save(logro);
//			}
//		} else {
//			Medalla plata = medallaDAO.findOne(8);
//			id = new Id(o.getId(),plata.getId());
//			logro = logroDAO.findOne(id);
//			if(logro != null ){
//				logro.setNivelProgreso(puntosTotal);
//				if(logro.getNivelProgreso() >= plata.getTotalProgreso()){
//					logro.setFechaObtencion(new Date());
//					Logro nuevoOro = new Logro();
//					id = new  Id(o.getId(), oro.getId());
//					nuevoOro.setId(id);
//					nuevoOro.setMedalla(oro);
//					nuevoOro.setOperador(o);
//					nuevoOro.setNivelProgreso(puntosTotal);
//					logroDAO.save(nuevoOro);
//				}
//				return logroDAO.save(logro);
//				
//			} else {
//				Medalla bronce = medallaDAO.findOne(7);
//				id = new Id(o.getId(),bronce.getId());
//				logro = logroDAO.findOne(id);
//				if(logro != null ){
//					logro.setNivelProgreso(puntosTotal);
//					if(logro.getNivelProgreso() >= bronce.getTotalProgreso()){
//						logro.setFechaObtencion(new Date());
//						Logro nuevoPlata = new Logro();
//						id = new  Id(o.getId(), plata.getId());
//						nuevoPlata.setId(id);
//						nuevoPlata.setMedalla(plata);
//						nuevoPlata.setOperador(o);
//						nuevoPlata.setNivelProgreso(puntosTotal);
//						logroDAO.save(nuevoPlata);
//					}
//					return logroDAO.save(logro);
//				} else {
//					Logro nuevoBronce = new Logro();
//					id = new  Id(o.getId(), bronce.getId());
//					nuevoBronce.setId(id);
//					nuevoBronce.setMedalla(bronce);
//					nuevoBronce.setOperador(o);
//					nuevoBronce.setNivelProgreso(puntosTotal);
//					return logroDAO.save(nuevoBronce);
//				}
//			}
//		}
//	}
	
	@Transactional
	private Logro validarLogrosCompetencia(Operador o, Fase f, Competencia competencia, Integer oroId, Integer plataId, Integer bronceId){
		boolean flagAplica = false;
		Experticia ex = null;
		for(Experticia e : o.getExperticias()){
			if(e.getNivelCompetencia().getCompetencia().getId() == competencia.getId() && f.getCompetencias().contains(competencia)){
				ex = e;
				flagAplica = true;
			}
		}
		Logro obtenido = null;		
		if(flagAplica){
			Medalla bronce = medallaDAO.findOne(bronceId);
			Medalla plata = medallaDAO.findOne(plataId);
			Medalla oro = medallaDAO.findOne(oroId);
			Id id = new Id(o.getId(),bronce.getId());
			Logro logroBronce = logroDAO.findOne(id);
			id = new Id(o.getId(),plata.getId());
			Logro logroPlata = logroDAO.findOne(id);
			id = new Id(o.getId(),oro.getId());
			Logro logroOro = logroDAO.findOne(id);
			logroBronce.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
			logroPlata.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
			logroOro.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
			if(logroBronce.getFechaObtencion() == null){
				if(logroBronce.getNivelProgreso() >= bronce.getTotalProgreso()){
					logroBronce.setFechaObtencion(new Date());	
					obtenido = logroBronce;
				}
			}
			if(logroPlata.getFechaObtencion() == null){
				if(logroPlata.getNivelProgreso() >= plata.getTotalProgreso()){
					logroPlata.setFechaObtencion(new Date());
					obtenido = logroPlata;
				}
			}
			if(logroOro.getFechaObtencion() == null){
				if(logroOro.getNivelProgreso() >= oro.getTotalProgreso()){
					logroOro.setFechaObtencion(new Date());
					obtenido = logroOro;
				}
			}
			logroDAO.save(logroBronce);
			logroDAO.save(logroPlata);
			logroDAO.save(logroOro);
		}		
		return obtenido;		
	}
	
//	private Logro validarLogrosCompetencia(Operador o, Fase f, Competencia competencia, Integer oroId, Integer plataId, Integer bronceId){
//		boolean flagAplica = false;
//		Experticia ex = null;
//		for(Experticia e : o.getExperticias()){
//			if(e.getNivelCompetencia().getCompetencia().getId() == competencia.getId() && f.getCompetencias().contains(competencia)){
//				ex = e;
//				flagAplica = true;
//			}
//		}
//		if(flagAplica){
//			Medalla oro = medallaDAO.findOne(oroId);
//			Id id = new Id(o.getId(),oro.getId());
//			Logro logro = logroDAO.findOne(id);
//			if(logro != null ){
//				if(logro.getFechaObtencion() != null){					
//					logro.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//					logroDAO.save(logro);
//					return null;
//				} else{
//					logro.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//					if(logro.getNivelProgreso() >= oro.getTotalProgreso()){
//						logro.setFechaObtencion(new Date());					
//					}
//					return logroDAO.save(logro);
//				}
//			} else {
//				Medalla plata = medallaDAO.findOne(plataId);
//				id = new Id(o.getId(),plata.getId());
//				logro = logroDAO.findOne(id);
//				if(logro != null ){
//					logro.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//					if(logro.getNivelProgreso() >= plata.getTotalProgreso()){
//						logro.setFechaObtencion(new Date());
//						Logro nuevoOro = new Logro();
//						id = new  Id(o.getId(), oro.getId());
//						nuevoOro.setId(id);
//						nuevoOro.setMedalla(oro);
//						nuevoOro.setOperador(o);
//						nuevoOro.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//						logroDAO.save(nuevoOro);
//					}
//					return logroDAO.save(logro);
//					
//				} else {
//					Medalla bronce = medallaDAO.findOne(bronceId);
//					id = new Id(o.getId(),bronce.getId());
//					logro = logroDAO.findOne(id);
//					if(logro != null ){
//						logro.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//						if(logro.getNivelProgreso() >= bronce.getTotalProgreso()){
//							logro.setFechaObtencion(new Date());
//							Logro nuevoPlata = new Logro();
//							id = new  Id(o.getId(), plata.getId());
//							nuevoPlata.setId(id);
//							nuevoPlata.setMedalla(plata);
//							nuevoPlata.setOperador(o);
//							nuevoPlata.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//							logroDAO.save(nuevoPlata);
//						}
//						return logroDAO.save(logro);
//					} else {
//						Logro nuevoBronce = new Logro();
//						id = new  Id(o.getId(), bronce.getId());
//						nuevoBronce.setId(id);
//						nuevoBronce.setMedalla(bronce);
//						nuevoBronce.setOperador(o);
//						nuevoBronce.setNivelProgreso((int) Math.round(ex.getTiempoEjercido()));
//						return logroDAO.save(nuevoBronce);
//					}
//				}
//			}
//		} else {
//			return null;
//		}		
//	}
	
	@Transactional
	@Override
	public void sumarPuntajeFinFase(Fase fase) {
		for(Operador o : fase.getOperadoresActividades()){
			int puntajeGanado = (int) Math.round(faseService.getHorasTranscurridasPorOperador(fase, o) * this.sumarValorPuntaje(o, fase));
			o.setPuntajeAcumulado(o.getPuntajeAcumulado() + puntajeGanado);
			operadorDAO.save(o);
		}
	}
	
	@Override
	public List<Logro> calcularLogrosFinFase(Fase fase) {
		//TODO evaluar necesidad 
		return null;
	}

	@Transactional(readOnly = true)
	public List<Medalla> buscarTodasMedallas(){
		return medallaDAO.findAll();
	}

	@Transactional(readOnly = true)
	public Medalla buscarMedallaPorId(Integer idMedalla){
		return medallaDAO.findOne(idMedalla);
	}

}
